package model;

/**
 * Возможные действия бойца.
 */
public enum ActionType {
    /**
     * Передать ход следующему бойцу.
     */
    END_TURN,

    /**
     * Переместить бойца в указанную соседнюю (по вертикали или горизонтали) клетку.
     * <p/>
     * Клетку можно указать, установив направление к ней ({@code Move.direction})
     * или её координаты ({@code Move.x} и {@code Move.y}).
     * Для симулятора игры направление является более приоритетным.
     * <p/>
     * Если для перемещения не хватает очков действия, то стратегия игрока считается упавшей.
     * Если боец не может переместиться (достигнута граница игрового поля или указанная клетка занята),
     * то боец не меняет свою позицию, однако очки действия всё равно тратятся.
     */
    MOVE,

    /**
     * Выстрелить в указанную клетку.
     * <p/>
     * Клетку можно указать, установив направление к ней ({@code Move.direction}), если клетка является соседней,
     * или её координаты ({@code Move.x} и {@code Move.y}).
     * Для симулятора игры направление является более приоритетным.
     * <p/>
     * Если для выстрела не хватает очков действия, то стратегия игрока считается упавшей.
     * Если указанная клетка находится за пределами игрового поля,
     * находится за пределом дальности стрельбы данного бойца
     * или же является клеткой расположения данного бойца, то стратегия игрока считается упавшей.
     */
    SHOOT,

    /**
     * Сменить стойку бойца на более высокую.
     * <p/>
     * Из положения лёжа ({@code TrooperStance.PRONE}) боец перейдёт
     * в положение сидя/пригнувшись ({@code TrooperStance.KNEELING}).
     * Из положения сидя/пригнувшись ({@code TrooperStance.KNEELING}) боец перейдёт
     * в положение стоя ({@code TrooperStance.STANDING}).
     * <p/>
     * Если для смены стойки не хватает очков действия, то стратегия игрока считается упавшей.
     * Если боец находится в положении стоя ({@code TrooperStance.STANDING}), то его стойка не меняется,
     * однако очки действия всё равно тратятся.
     */
    RAISE_STANCE,

    /**
     * Сменить стойку бойца на более низкую.
     * <p/>
     * Из положения стоя ({@code TrooperStance.STANDING}) боец перейдёт
     * в положение сидя/пригнувшись ({@code TrooperStance.KNEELING}).
     * Из положения сидя/пригнувшись ({@code TrooperStance.KNEELING}) боец перейдёт
     * в положение лёжа ({@code TrooperStance.PRONE}).
     * <p/>
     * Если для смены стойки не хватает очков действия, то стратегия игрока считается упавшей.
     * Если боец находится в положении лёжа ({@code TrooperStance.PRONE}), то его стойка не меняется,
     * однако очки действия всё равно тратятся.
     */
    LOWER_STANCE,

    /**
     * Бросить гранату в указанную клетку. Граната изымается у бойца, совершающего ход.
     * <p/>
     * Клетку можно указать, установив направление к ней ({@code Move.direction}), если клетка является соседней,
     * или её координаты ({@code Move.x} и {@code Move.y}).
     * Для симулятора игры направление является более приоритетным.
     * <p/>
     * Если для броска гранаты не хватает очков действия, то стратегия игрока считается упавшей.
     * Если боец не имеет гранаты, то стратегия игрока считается упавшей.
     * Если указанная клетка находится за пределами игрового поля
     * или находится за пределом дальности броска гранаты, то стратегия игрока считается упавшей.
     */
    THROW_GRENADE,

    /**
     * Вылечить себя или бойца в указанной соседней (по вертикали или горизонтали) клетке с помощью аптечки
     * первой помощи. Аптечка изымается у бойца, совершающего ход.
     * <p/>
     * Клетку можно указать, установив направление к ней ({@code Move.direction}), если клетка является соседней,
     * или её координаты ({@code Move.x} и {@code Move.y}).
     * Для симулятора игры направление является более приоритетным.
     * <p/>
     * Если для использования аптечки не хватает очков действия, то стратегия игрока считается упавшей.
     * Если боец не имеет аптечки, то стратегия игрока считается упавшей.
     * Если указанная клетка находится за пределами игрового поля
     * или не является собственной клеткой бойца или соседней с ней, то стратегия игрока считается упавшей.
     * Если в указанной клетке нет бойца, то боец, совершающий ход, сохраняет аптечку,
     * однако очки действия всё равно тратятся.
     */
    USE_MEDIKIT,

    /**
     * Съесть сухпаёк. Сухпаёк изымается у бойца, совершающего ход.
     * <p/>
     * Если для использования сухпайка не хватает очков действия, то стратегия игрока считается упавшей.
     * Если боец не имеет сухпайка, то стратегия игрока считается упавшей.
     */
    EAT_FIELD_RATION,

    /**
     * Умение полевого медика: вылечить себя или бойца в указанной соседней (по вертикали или горизонтали) клетке.
     * <p/>
     * Клетку можно указать, установив направление к ней ({@code Move.direction}), если клетка является соседней,
     * или её координаты ({@code Move.x} и {@code Move.y}).
     * Для симулятора игры направление является более приоритетным.
     * <p/>
     * Если для использования умения не хватает очков действия, то стратегия игрока считается упавшей.
     * Если боец, совершающий ход, не является полевым медиком, то стратегия игрока считается упавшей.
     * Если указанная клетка находится за пределами игрового поля
     * или не является собственной клеткой медика или соседней с ней, то стратегия игрока считается упавшей.
     * Если в указанной клетке нет бойца, то медик ничего не делает, однако очки действия всё равно тратятся.
     */
    HEAL,

    /**
     * Умение командира: отправить в штаб запрос на вылет самолёта-разведчика. В результате, в начале следующего хода
     * командира в полях {@code Player.approximateX} и {@code Player.approximateY} каждого игрока будут содержаться
     * координаты примерного расположения его бойцов. Значение каждой координаты будет равно среднему
     * арифметическому значению соответствующих координат юнитов игрока на поле со случайным смещением, не превышающим
     * по модулю 5. Гарантируется, что полученная точка лежит в пределах игрового поля.
     * <p/>
     * Если для использования умения не хвататет очков действия, то стратегия игрока считается упавшей.
     * Если боец, совершающий ход, не является командиром, то стратегия игрока считается упавшей.
     */
    REQUEST_ENEMY_DISPOSITION
}
